#include "Imagen.h"

Imagen::Imagen(std::string* rutaImagen ){

	// carga la imagen desde el archivo
	superficie = IMG_Load(rutaImagen->c_str());
	
	imagenCargada = (superficie == NULL) ? false : true;

	SDL_GetClipRect(superficie, &imagen);
	SDL_GetClipRect(superficie, &representacion);

	supObservable = SDL_CreateRGBSurface(SDL_HWSURFACE,imagen.w,imagen.h,32,0,0,0,255);

	SDL_UpperBlit(superficie, &imagen, supObservable, &representacion);
	cantidadPasosAnimacion = 1;
}

Imagen::Imagen(std::string* rutaImagen, int cantidad) : Imagen::Imagen(rutaImagen) {

	setPasosAnimacion(cantidad);
}

Imagen::~Imagen() {

	SDL_FreeSurface(superficie);
	SDL_FreeSurface(supObservable);
}

bool Imagen::cargada() {

	return imagenCargada;
}

int Imagen::getAncho() {

	return imagen.w;
}

int Imagen::getAlto() {

	return imagen.h;
}

int Imagen::definirPosicion(int x, int y) {

	imagen.x = x;
	imagen.y = y;
	return 0;
}

int Imagen::definirDimension(int ancho, int alto) {

	imagen.w = ancho;
	imagen.h = alto;

	return 0;
}

int Imagen::definirParametros(int x, int y, int ancho, int alto) {

	return definirPosicion(x, y) + definirDimension(ancho, alto);
}

int Imagen::cambiarPosicion(int x, int y) {

	representacion.x = x;
	representacion.y = y;

	posicionOriginal[0] = x;
	posicionOriginal[1] = y;
	return 0;
}

int Imagen::cambiarDimension(int ancho, int alto) {

	representacion.w = ancho;
	representacion.h = alto;

	representacionOriginal[0] = ancho;
	representacionOriginal[1] = alto;
	return 0;
}

int Imagen::cambiarParametros(int x, int y, int ancho, int alto) {

	return cambiarPosicion(x, y) + cambiarDimension(ancho, alto);
}

void Imagen::reubicar(int i, double delta) {

	int temp = posicionOriginal[i] * delta;

	if (i == 0)

		representacion.x = temp;

	else if (i == 1)

		representacion.y = temp;
}


void Imagen::redimensionar(int i, double delta) {
	
	int temp = representacionOriginal[i] * delta;

	if ( i == 0 )
		
		representacion.w = temp;

	else if (i == 1)

		representacion.h = temp;
}

int Imagen::seleccionarPosicion(int x, int y) {

	return definirPosicion(x, y) + cambiarPosicion(x, y);
}

int Imagen::seleccionarDimension(int ancho, int alto) {

	return definirDimension(ancho, alto) + cambiarDimension(ancho, alto);
}

int Imagen::seleccionarParametros(int x, int y, int ancho, int alto) {

	return definirParametros(x, y, ancho, alto) + cambiarParametros(x, y, ancho, alto);
}

void Imagen::dibujar(SDL_Surface* superficieDestino) {

	SDL_Rect* rectSup = 0;
	SDL_GetClipRect(superficieDestino, rectSup);

	SDL_SetColorKey(supObservable, SDL_SRCCOLORKEY, SDL_MapRGB(supObservable->format, 255, 0, 0));


	SDL_UpperBlit(supObservable, &representacion, superficieDestino, rectSup);
}

void Imagen::setPasosAnimacion(int cantidad) {

	pasoAnimacion = 0;
	cantidadPasosAnimacion = cantidad;

	anchoAnimacion = imagen.w;
	seleccionarDimension(anchoAnimacion / cantidad, imagen.h);
}

void Imagen::animar() {
	
	++pasoAnimacion;
	definirPosicion((pasoAnimacion*imagen.w) % anchoAnimacion , 0);

	SDL_FillRect(supObservable,0,0x000000);
	SDL_UpperBlit(superficie, &imagen, supObservable, &representacion);
}